#!/bin/bash


# shell 函数

# [ function ] funname [()]
# {
#
#    action;
#
#    [return int;]
#
# }
# [] 表示可选项
#1、可以带function fun() 定义，也可以直接fun() 定义,不带任何参数。
#2、参数返回，可以显示加：return 返回，如果不加，将以最后一条命令运行结果，作为返回值。 return后跟数值n(0-255


demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun # 函数调用
echo "-----函数执行完毕-----"
echo "--------------------------------"

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

# 函数返回值在调用该函数后通过 $? 来获得。
# 注意：所有函数在使用前必须定义。
# 这意味着必须将函数放在脚本开始部分，直至shell解释器首次发现它时，才可以使用。
# 调用函数仅使用其函数名即可。


echo "-------------函数参数-------------------"
# 在Shell中，调用函数时可以向其传递参数。
# 在函数体内部，通过 $n 的形式来获取参数的值，例如，$1表示第一个参数，$2表示第二个参数..
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
# 还有几个特殊字符用来处理参数
# $#	传递到脚本或函数的参数个数
# $*	以一个单字符串显示所有向脚本传递的参数
# $$	脚本运行的当前进程ID号
# $!	后台运行的最后一个进程的ID号
# $@	与$*相同，但是使用时加引号，并在引号中返回每个参数。
# $-	显示Shell使用的当前选项，与set命令功能相同。
# $?	显示最后命令的退出状态。0表示没有错误，其他任何值表明有错误。
echo "-------------------------------"

# 重定向
# 命令	              说明
# command > file	  将输出重定向到 file。
# command < file	  将输入重定向到 file。
# command >> file	  将输出以追加的方式重定向到 file。
# n > file	        将文件描述符为 n 的文件重定向到 file。
# n >> file	        将文件描述符为 n 的文件以追加的方式重定向到 file。
# n >& m	          将输出文件 m 和 n 合并。
# n <& m	          将输入文件 m 和 n 合并。
# << tag	          将开始标记 tag 和结束标记 tag 之间的内容作为输入。

 who > users  # 输出已被从默认的标准输出设备（终端）重定向到指定的文件
 echo "菜鸟教程：www.runoob.com" >> users # 追加到users文件末尾


echo "-----------输入重定向--------------------"
# command1 < file1
# 本来需要从键盘获取输入的命令会转移到文件读取内容

# command1 < infile > outfile
# 同时替换输入和输出，执行command1，从文件infile读取内容，然后将输出写入到outfile中。

# 如果希望执行某个命令，但又不希望在屏幕上显示输出结果，那么可以将输出重定向到 /dev/null：
# command > /dev/null


echo "-----------文件包含--------------------"
# . filename   # 注意点号(.)和文件名中间有一空格
# source filename
# 这两种方式都可以

# . ./test1.sh
# source ./test1.sh
# echo "菜鸟教程官网地址：$url" # url 就是 test1.sh 中的变量
